package com.study.suanfa.lianbiao;

/**
 * @description: ShuangLianBiao  双向链表
 * @date: 2020/11/30 13:57
 * @author: hcm
 * @version: 1.0
 */
public class ShuangLianBiao {
    public static void main(String[] args) {
        ShuangLianList sLinkList = new ShuangLianList();
        DataNode node1 = new DataNode("a");
        DataNode node2 = new DataNode("b");
        DataNode node3 = new DataNode("c");
        DataNode node4 = new DataNode("d");
        DataNode node5 = new DataNode("e");
        sLinkList.addToLinkList(node1);
        sLinkList.addToLinkList(node2);
        sLinkList.addToLinkList(node3);
        sLinkList.addToLinkList(node4);
        sLinkList.addToLinkList(node5);
        sLinkList.showList();

        //删除节点  ，直接删除当前节点，上一个.next指向当前.next,当前.next.pre指向上一个


    }





}

/**
 * 双链表结构类
 */
class  ShuangLianList{
    DataNode head = new DataNode(null);



    /**
     * 双向链表的添加
     */
    public void addToLinkList(DataNode dataNode) {
        //头保持不变
        DataNode temp  = head;
        //尾插法，并且维持插入的元素具有双向指针
        while (true){
            //推出条件
            if(temp.next == null)
            {
                break;
            }
            //指针移动
            temp = temp.next;
        }
        //指针互指
        temp.next = dataNode;
        dataNode.pre = temp;

    }


    /**
     * 修改
     */


    /**
     * 删除
     */

    /**
     * 查询
     */
    public void showList() {
        //双指针，如果成功，那么就是可以从头指到尾部，从尾部指到头部
        DataNode temp = head;
        while (true){
            if(temp.next == null){
                break;
            }
            temp= temp.next;

            System.out.println("顺序指针"+temp);
        }
        //记录尾巴
        DataNode rear = temp;
        while (true){
            if(rear.pre == null){
                break;
            }

            System.out.println("头指针"+rear);
            rear = rear.pre;
        }

    }
}

/**
 * 节点类
 */
class DataNode{

    /**
     * 数据域
     */
    String Data ;

    /**
     * 前指针
     */
    DataNode pre;

    /**
     * 后指针
     */
    DataNode next;

    public DataNode(String data) {
        Data = data;
    }

    public DataNode() {
    }

    @Override
    public String toString() {
        return "DataNode{" +
                "Data='" + Data + '\'' +

                '}';
    }
}
